mitmproxy python API
mitmproxy 是一款开源的交互式 HTTPS 代理,能够拦截、查看、修改和重放 HTTP 请求和响应。它的 Python API 可以让你通过编程方式使用 mitmproxy,实现自动化的网络请求分析、调试和测试等功能。
安装 mitmproxy:
pip install mitmproxy
拦截并修改响应
可以通过定义处理 HTTP 流量的函数来开始。例如,以下代码会将所有 HTTP 响应的文本反转:
from mitmproxy import http
def response(flow: http.HTTPFlow):
if flow.response and flow.response.content:
flow.response.content = flow.response.content[::-1]
自定义代理
你可以创建一个自定义的代理来进行更复杂的操作。
创建代理
首先,需要从 mitmproxy.options
和 mitmproxy.proxy
导入必要的模块,并设置代理选项:
from mitmproxy.options import Options
from mitmproxy.proxy.config import ProxyConfig
from mitmproxy.proxy.server import ProxyServer
from mitmproxy.tools.dump import DumpMaster
options = Options(listen_host='0.0.0.0', listen_port=8080)
m = DumpMaster(options, with_termlog=False, with_dumper=False)
config = ProxyConfig(options)
m.server = ProxyServer(config)
添加处理函数
接着,你可以添加自定义的请求和响应处理函数。以下代码在每个请求 URL 中添加一个查询参数:
from mitmproxy import ctx
def request(flow: http.HTTPFlow):
flow.request.query["mitmproxy"] = "rocks"
def response(flow: http.HTTPFlow):
ctx.log.info("Response received!")
启动代理
最后,可以运行代理并添加处理函数:
m.addons.add(request)
m.addons.add(response)
m.run()
证书处理
如果需要拦截 HTTPS 请求,可能需要处理证书。可以使用 mitmproxy 的证书管理工具,例如安装 CA 证书到系统信任存储中。
使用场景
mitmproxy 的 Python API 适用于自动化测试、爬虫、安全分析等场景,它提供了强大的流量分析和修改能力。
代码启动 mitmproxy
import mitmproxy.options
from mitmproxy.tools.dump import DumpMaster
import asyncio
class ProxyOptions(mitmproxy.options.Options):
listen_port = 11270
listen_host = "localhost"
class RequestLogger:
def request(self, flow):
print(flow.request)
async def run_proxy():
opts = ProxyOptions()
master = DumpMaster(
opts,
with_termlog=False,
with_dumper=False,
)
master.addons.add(RequestLogger())
await master.run()
return master
def start_proxy_loop():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(run_proxy())
main.py(这是一个 PySide/PyQt 程序):
if __name__ == "__main__":
a = Application(sys.argv)
w = MainWindow()
w.setGeometry(100, 100, 600, 768)
w.show()
proxy = QNetworkProxy()
proxy.setType(QNetworkProxy.ProxyType.HttpProxy)
proxy.setHostName("localhost")
proxy.setPort(11270)
QtNetwork.QNetworkProxy.setApplicationProxy(proxy)
proxy_thread = threading.Thread(target=start_proxy_loop)
proxy_thread.start()
sys.exit(a.exec())
本文作者:Maeiee
本文链接:mitmproxy python API
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!